﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections;
using System.Windows.Media;

using Civilisation_code.PJoueur;
using Civilisation_code.PCarte;
using Civilisation_code.PInterfaces_Fabrique_Unite;
using Civilisation_code.PPartie;
using Civilisation_code.PRessource;
using Civilisation_code.Implementation_Unite_EII;
using Civilisation_code.Implementation_Unite_INFO;

namespace Tests
{
    [TestClass]
    public class TestVille
    {
        [TestMethod]
        public void TestProductionInitial()
        {
            //A sa création, un village n'a pas annexe de cases et produit les ressources de sa propre case
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            ((Enseignant)depart.Unites[0]).creerVillage();

            Ville ville = depart.Ville;

            Assert.AreEqual(depart._ressource.minerais, ville.productionMinerais());
            Assert.AreEqual(depart._ressource.nourriture, ville.productionFruit());
        }

        [TestMethod]
        public void TestProductionAvecAnnexion()
        {
            //Même test, mais en ayant annexe une case
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            ((Enseignant)depart.Unites[0]).creerVillage();

            Ville ville = depart.Ville;
            ville._cases_annexes.Add(arrivee);
            arrivee.Ville_annexee = ville;

            Assert.AreEqual(depart._ressource.minerais + arrivee._ressource.minerais, ville.productionMinerais());
            Assert.AreEqual(depart._ressource.nourriture + arrivee._ressource.nourriture, ville.productionFruit());
        }

        [TestMethod]
        public void TestProductionUniteSansRessources()
        {
            //On essaye de produire une unité en ayant pas les ressources suffisantes
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            ((Enseignant)depart.Unites[0]).creerVillage();

            Ville ville = depart.Ville;
            ville._minerai = 50-ville.Case._ressource.minerais;

            Assert.AreEqual(0,depart.Unites.Count);
            //On essaye de déclencher la prodution d'un étudiant
            ville.nouveauTour();
            //Doit échouer
            Assert.AreEqual(0, depart.Unites.Count);
            Assert.AreEqual(50, ville._minerai);
        }

        [TestMethod]
        public void TestProductionUniteAvecRessources()
        {
            //On essaye de produire une unité en ayant les ressources suffisantes
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            ((Enseignant)depart.Unites[0]).creerVillage();

            Ville ville = depart.Ville;
            ville._minerai = 110 - ville.Case._ressource.minerais;

            Assert.AreEqual(0, depart.Unites.Count);
            //On essaye de déclencher la prodution d'un étudiant
            ville.nouveauTour();
            //Doit échouer
            Assert.AreEqual(1, depart.Unites.Count);
            Assert.AreEqual(10, ville._minerai);
        }

        [TestMethod]
        public void TestCasesSuggerees()
        {
            //On regarde le nombre de cases suggerees
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];
            Joueur j2 = monteur._partie._joueurs[1];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            ((Enseignant)depart.Unites[0]).creerVillage();

            Ville ville = depart.Ville;

            Assert.AreEqual(24, ville.getCasesDisponibles().Count);

            ville._cases_annexes.Add(arrivee);
            arrivee.Ville_annexee = ville;

            Assert.AreEqual(23, ville.getCasesDisponibles().Count);
        }
    }
}
